#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    // 读取配置文件
    FILE *fp = fopen("config", "r");
    char lib[300];

    fread(lib, 1, 300, fp);
    fclose(fp);

    char *lib_name;

    lib_name = strtok(lib, "\n\r");
    do
    {
        void *handle = dlopen(lib_name, RTLD_NOW);
        if (handle == NULL)
        {
            printf("加载动态库[%s]失败:%s\n", lib_name, strerror(errno));
            exit(0);
        }
        // 在库中查找事先约定好的接口
        void (*detection)(void);
        detection = dlsym(handle, "detection");
        if (detection == NULL)
        {
            printf("查找符号[%s]失败:%s\n", "detection", strerror(errno));
            exit(0);
        }

        // 潇洒地调用该接口
        detection();
    } while ((lib_name = strtok(NULL, "\n\r")) != NULL);
}